#ifndef __SPEED_H
#define __SPEED_H


#include "stdint.h"


/* ====================== 自定义常量 =========================== */

extern volatile uint32_t gSpeedPID_TimeCNT;



/* ===================== 自定义结构体 ========================== */

/*
	增量式PID调节（速度环）
*/
typedef struct
{
	/* data */
    float kp;           // 比例
    float ki;           // 积分
    float kd;           // 微分
	
    float pre;          // 实际
    float tar;          // 目标
    float bias;         // 目标与实际之前差值（目标-实际）
    float lastBias;		// 上次差值
    float out;          // 输出
    float outMax;       // 输出限幅
	float err;          // 累计差值（这里貌似没用）
	float cycle;		// 周期，单位秒
	
	float integral;		// 误差积分：位置式PID需要的参数
	
}SPID_Struct;	// speed pid struct
typedef SPID_Struct *PSPID_Struct;

/*
	电机速度控制结构体
*/
typedef struct
{
    uint8_t			isEnable;	// 使能
    uint32_t		sysTimer;	// 系统时钟
    SPID_Struct 	sPID;		// PID
    float (*GetMotorSpeed)(void);			// 获取电机实际转速
    void(*SetOutCurrent)(float current);	// 设置电机输出电流
	
}SPEED_Control_Struct;	// SPEED control struct
typedef SPEED_Control_Struct *PSPEED_Control_Struct;


/* ======================= 对外接口 ============================ */

void SPEED_PID_TIMEBASE(uint16_t ms);
uint32_t SPEED_PID_GETTIME(void);
uint8_t SPEED_PID_TIMEOUT(float timeOut, float startTime);

void SpeedPIDCycle(PSPEED_Control_Struct pSpeedPID);
void SetSpeedPIDParams(PSPEED_Control_Struct pSpeedPID, float kp, float ki, float kd);
void SetSpeedPIDTar(PSPEED_Control_Struct pSpeedPID, float tar);
void SetSpeedPIDEnable(PSPEED_Control_Struct pSpeedPID, float isEnable);
void SpeedPIDPrintf(PSPEED_Control_Struct pSpeedPID);


#endif /* __SPEED_H */






